home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / games / sokosrc.zoo / save.c < prev    next >
C/C++ Source or Header  |  1991-01-26  |  4KB  |  131 lines

  1. #if 1
  2. #include <stdio.h>
  3. #include "sokoban.h"
  4. #if !ATARIST
  5. #include <sys/types.h>
  6. #endif
  7. #include <stat.h>
  8. #include <signal.h>
  9.  
  10. extern char *username;
  11. extern char map[MAXROW+1][MAXCOL+1];
  12. extern short level, moves, pushes, packets, savepack, rows, cols;
  13. extern POS ppos;
  14. extern soko_state state[];
  15. extern int state_num;
  16.  
  17. #if ATARIST
  18. int savedbn;
  19. #else
  20. long  savedbn;
  21. #endif
  22.  
  23. char *sfname;
  24. FILE *savefile;
  25. struct stat sfstat;
  26.  
  27. short savegame() {
  28.  
  29.    short ret = 0;
  30.  
  31.    signal( SIGINT, SIG_IGN);
  32.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  33. #if ATARIST
  34.    sprintf( sfname, "%s\\%s.sav", SAVEPATH, username);
  35. #else
  36.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  37. #endif
  38.  
  39.    if( (savefile = fopen( sfname, "w")) == NULL)
  40.       ret = E_FOPENSAVE;
  41.    else {
  42.       savedbn = fileno( savefile);
  43.       if( write( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  44.         ret = E_WRITESAVE;
  45.       else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS))
  46.         ret = E_WRITESAVE;
  47.       else if( write( savedbn, &level, 2) != 2)    ret = E_WRITESAVE;
  48.       else if( write( savedbn, &moves, 2) != 2)    ret = E_WRITESAVE;
  49.       else if( write( savedbn, &pushes, 2) != 2)   ret = E_WRITESAVE;
  50.       else if( write( savedbn, &packets, 2) != 2)  ret = E_WRITESAVE;
  51.       else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE;
  52.       else if( write( savedbn, &rows, 2) != 2)     ret = E_WRITESAVE;
  53.       else if( write( savedbn, &cols, 2) != 2)     ret = E_WRITESAVE;
  54.     else if (write(savedbn, &state_num, sizeof(state_num)) !=
  55.         sizeof(state_num)) ret = E_WRITESAVE;
  56.     else if (write(savedbn, state, state_num * sizeof(soko_state)) !=
  57.         state_num * sizeof(soko_state)) ret = E_WRITESAVE;
  58.       else {
  59.         fclose( savefile);
  60.         if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE;
  61.         else if( (savefile = fopen( sfname, "a")) == NULL)
  62.             ret = E_FOPENSAVE;
  63.          else {
  64.            if( write( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  65.               ret = E_WRITESAVE;
  66.            fclose( savefile);
  67.         }
  68.       }
  69.    }
  70.    if( (ret == E_WRITESAVE) || (ret == E_STATSAVE)) unlink( sfname);
  71.    signal( SIGINT, SIG_DFL);
  72.  
  73.    return( ret);
  74. }
  75.  
  76. short restoregame() {
  77.  
  78.    short ret = 0;
  79.    struct stat oldsfstat;
  80.  
  81.    signal( SIGINT, SIG_IGN);
  82.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  83. #if ATARIST
  84.    sprintf( sfname, "%s\\%s.sav", SAVEPATH, username);
  85. #else
  86.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  87. #endif
  88.    if( stat( sfname, &oldsfstat) < -1)
  89.       ret = E_NOSAVEFILE;
  90.    else {
  91.       if( (savefile = fopen( sfname, "r")) == NULL)
  92.         ret = E_FOPENSAVE;
  93.       else {
  94.          savedbn = fileno( savefile);
  95.          if( read( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  96.            ret = E_READSAVE;
  97.          else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS))
  98.            ret = E_READSAVE;
  99.          else if( read( savedbn, &level, 2) != 2)    ret = E_READSAVE;
  100.          else if( read( savedbn, &moves, 2) != 2)    ret = E_READSAVE;
  101.          else if( read( savedbn, &pushes, 2) != 2)   ret = E_READSAVE;
  102.          else if( read( savedbn, &packets, 2) != 2)  ret = E_READSAVE;
  103.          else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE;
  104.          else if( read( savedbn, &rows, 2) != 2)     ret = E_READSAVE;
  105.          else if( read( savedbn, &cols, 2) != 2)     ret = E_READSAVE;
  106.         else if (read(savedbn, &state_num, sizeof(state_num)) !=
  107.             sizeof(state_num)) ret = E_READSAVE;
  108.         else if (read(savedbn, state, state_num * sizeof(soko_state)) !=
  109.             state_num * sizeof(soko_state)) ret = E_READSAVE;
  110.         else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  111.            ret = E_READSAVE;
  112.  
  113.         else if( (sfstat.st_dev != oldsfstat.st_dev) ||
  114.                   (sfstat.st_ino != oldsfstat.st_ino) ||
  115.                   (sfstat.st_nlink != oldsfstat.st_nlink) ||
  116.                   (sfstat.st_uid != oldsfstat.st_uid) ||
  117.                   (sfstat.st_gid != oldsfstat.st_gid) ||
  118.                   (sfstat.st_mtime != oldsfstat.st_mtime))
  119.  
  120.             ret = E_ALTERSAVE;
  121.       }
  122.       unlink( sfname);
  123.    }
  124.    signal( SIGINT, SIG_DFL);
  125.    return( ret);
  126. }
  127. #else
  128. savegame() {return 0}
  129. restoregame() {return 0}
  130. #endif
  131.